﻿#ifndef SPLCGLOBALDEFINE_H
#define SPLCGLOBALDEFINE_H

#include <stdint.h>

#include <QString>

#include "IPlcBaseItem.h"

#pragma pack(4)

//单行PLC最大显示的元件数量
#define PLC_MAX_SHOW_ITEM 8
//缓存修改的最大步数
#define PLC_MAX_SAVE_STEP 5

namespace plc
{
enum EComponentType
{
    Empty        = 0,    //空白
    Line         = 1,    //连接线
    OpenContact  = 10,   //常开触点
    CloseContact = 11,   //常闭触点
    Pulse        = 12,   //上升沿
    Falling      = 13,   //下降沿
    Coil         = 40,   //线圈
    Set          = 41,   //置位线圈
    Reset        = 42,   //复位线圈

    //   FunctionBlock = 60,   //功能块
    TON  = 61,   //延时接通
    TOF  = 62,   //延时关断
    TONR = 63,   //保持型延时接通
    CTU  = 64,   //整计数器
    RST  = 65,   //功能块复位

    //以下作为界面元件使用
    LeftJump  = 100,   //左跳转
    RightJump = 101,   //右跳转

    BranchDown = 110,   //向下的分支线
    Comment    = 150,   //注释

};

enum EComponentName
{
    Input_X   = 0,    //硬件对应的X0-X23
    Input_SX  = 1,    //系统专用的SX0-SX319
    Output_Y  = 10,   //硬件对应Y0-Y23
    Output_SY = 11,   //系统专用SY0-SY319

    Coil_MC     = 20,   // M线圈
    Coil_SMC    = 21,   //系统专用M线圈
    Register_UI = 25,   //通用寄存器

    Counter_CTU = 30,   //增计数器
    Timer_T     = 40,   //接通延时定时器
    Timer_ST    = 41,   //系统接通延时定时器

};

typedef struct
{
    EComponentType type;
    EComponentName name;
    uint16_t code;   // 元件代号 当类型为UI时，变量复用为 模块号。
    uint32_t param;    // 参数 当类型为UI时，变量复用为 位号
    int8_t parmType;   //参数类型 0无变量 1变量UI 2变量I
    int8_t branch;     //是否有分支: 1表有分支；其余表无分支
} SComponent;

typedef struct
{
    SComponent component;     //元件信息
    QString variableNum;      //元件编号，便于后期查找
    IPlcBaseItem *pItem;      //当前元件的指针
    IPlcBaseItem *pComment;   //关联注释元件
} SItemData;

//变量数值
typedef struct
{
    //TODO
    int8_t SX[40];
    int8_t SY[40];
    int8_t X[70];
    int8_t Y[70];
    int8_t SM[512];
    int8_t M[256];
    int16_t UI[4096];
    int8_t C[3];
    int8_t T[10];
    int8_t ST[5];
} SVariableValue;


}   // namespace plc

#pragma pack()

#endif   // SPLCGLOBALDEFINE_H
